package com.vip;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;   
import java.io.OutputStream;
import java.net.HttpURLConnection;   
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;   
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

import javax.net.ssl.HttpsURLConnection;


import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
    
/**  
 * HTTP请求对象  
 *   
 * @author YYmmiinngg  
 */  
public class HttpRequester {   
    //----------test  vipshop public_api-------------------
    private String xmlStr="";
	private HttpURLConnection httpConn;
	
    public String sendDataPost(String strUrl, String outData) {
		try {
	        httpConn = (HttpURLConnection) new URL(strUrl).openConnection();
			HttpURLConnection.setFollowRedirects(false);
			httpConn.setDoInput(true);
			httpConn.setDoOutput(true);
			httpConn.setReadTimeout(15000);
			httpConn.setConnectTimeout(15000);
			httpConn.setRequestProperty("Accept-Charset", "utf-8");
			httpConn.setRequestProperty("Content-Type", "html/xml");
			httpConn.setRequestProperty("User-Agent", "systempatch");
			httpConn.setInstanceFollowRedirects(false);
			// send out data using POST method
			httpConn.setRequestMethod("POST");
			
			httpConn.connect();
			
			DataOutputStream dout = new DataOutputStream(httpConn.getOutputStream());
			if(outData != null)
			dout.write(outData.getBytes());
			dout.flush();
			dout.close();
			
			// receive the response
			xmlStr = null;
			int rspCode = httpConn.getResponseCode();
			System.out.print("rspCode :"+rspCode+"\r\n");
			int i = 0;
			// process HTTP 200-OK
			if(rspCode == HttpsURLConnection.HTTP_OK) {
				BufferedReader br = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "utf-8"));

				String strLine;
				StringBuffer rspBuf = new StringBuffer(); 
				while((strLine=br.readLine()) != null) {
					 rspBuf.append(strLine + "\r\n");
				}
				xmlStr = rspBuf.toString();
				br.close();
				
				httpConn.getInputStream().close();
				httpConn.disconnect();
				return xmlStr;
			}
			return xmlStr;
		}
		catch(Exception e) {
			xmlStr = null;
			e.printStackTrace();
			return xmlStr;
		}
	}
//    public static String sendPostRequest(String path, Map<String, String> params, String encode) throws Exception{
//    	String xmlStr = null;
//    	try {
//    		StringBuilder sb = new StringBuilder();
//    		if(params!=null && !params.isEmpty()){
//    			for(Map.Entry<String, String> entry : params.entrySet()){
//    				sb.append(entry.getKey()).append('=')
//    					.append(URLEncoder.encode(entry.getValue(), "UTF-8")).append('&');
//    			}
//    			sb.deleteCharAt(sb.length() - 1);
//    		}
//    		byte[] entitydata = sb.toString().getBytes();//得到实体数据
//    		
//    		URL url = new URL(path);
//    		HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//    		conn.setConnectTimeout(5*1000);
//    		conn.setRequestMethod("POST");
//    		conn.setDoOutput(true);//允许对外输出实体数据,如果采用post方式发送请求参数，必须设置为true
//    		conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
//    		conn.setRequestProperty("Content-Length", String.valueOf(entitydata.length));
//    		OutputStream outStream = conn.getOutputStream();
//    		outStream.write(entitydata);
//    		outStream.flush();
//    		if(conn.getResponseCode()==200){
//    			//return StreamTool.readInputStream(conn.getInputStream());
//    			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
//
//    			String strLine;
//    			StringBuffer rspBuf = new StringBuffer(); 
//    			while((strLine=br.readLine()) != null) {
//    				 rspBuf.append(strLine + "\r\n");
//    			}
//    			xmlStr = rspBuf.toString();
//    			System.out.println("rsp upImage:"+xmlStr);
//    			br.close();
//    			conn.getInputStream().close();
//    			conn.disconnect();
//    			return xmlStr;
//    		}else{
//    			throw new Exception("请求失败");
//    		}
//		} catch (Exception e) {
//			xmlStr = null;
//			e.printStackTrace();
//			return xmlStr;
//		}
//		
//	}
    
    public static void post(String path, Map<String, String> params, FormFile file) throws Exception{
 	   resHttp(path, params, new FormFile[]{file});
 	}
    public static void post2(String path, Map<String, String> params, FormFile file) throws Exception{
  	   post(path, params, new FormFile[]{file});
  	}
    public static void resHttp(String path,Map<String, String> params,FormFile[] files) {
		 String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线  
	        String MULTIPART_FORM_DATA = "multipart/form-data"; 
	        final String endline = "--" + BOUNDARY + "--\r\n";//数据结束标志
	       
		   try
		    {
			   StringBuilder sb = new StringBuilder();
	    		int fileDataLength = 0;
		        for(FormFile uploadFile : files){//得到文件类型数据的总长度
		        	StringBuilder fileExplain = new StringBuilder();
		 	        fileExplain.append("--");
		 	        fileExplain.append(BOUNDARY);
		 	        fileExplain.append("\r\n");
		 	        fileExplain.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");
		 	        fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
		 	        fileExplain.append("\r\n");
		 	        fileDataLength += fileExplain.length();
		        	if(uploadFile.getInStream()!=null){
		        		fileDataLength += uploadFile.getFile().length();
			 	    }else{
			 	    	fileDataLength += uploadFile.getData().length;
			 	    }
		        }
	    		 //上传的表单参数部分，格式请参考文章  
	            for (Map.Entry<String, String> entry : params.entrySet()) {//构建表单字段内容  
	                sb.append("--");  
	                sb.append(BOUNDARY);  
	                sb.append("\r\n");  
	                sb.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");  
	                sb.append(entry.getValue());  
	                sb.append("\r\n");  
	            }  
	            byte[] entitydata = sb.toString().getBytes();//得到实体数据
	            //计算传输给服务器的实体数据总长度
	            int dataLength = sb.toString().getBytes().length + fileDataLength +  endline.getBytes().length;
		      URL url = new URL(path);
		      HttpURLConnection httpURLConnection = (HttpURLConnection) url
		          .openConnection();
		      httpURLConnection.setDoInput(true);
		      httpURLConnection.setDoOutput(true);
		      httpURLConnection.setUseCaches(false);
		      httpURLConnection.setRequestMethod("POST");
		      httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
		      httpURLConnection.setRequestProperty("Charset", "UTF-8");
		      httpURLConnection.setRequestProperty("Content-Length", String.valueOf(dataLength));
		      httpURLConnection.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY);  
		      DataOutputStream dos = new DataOutputStream(httpURLConnection
		          .getOutputStream());
		      dos.write(entitydata);
//		      
//		      for(FormFile file : files){  
//		            StringBuilder split = new StringBuilder();  
//		            split.append("–");  
//		            split.append(BOUNDARY);  
//		            split.append("\r\n");  
//		            split.append("Content-Disposition: form-data;name=\""+ file.getFilname()+"\";filename=\""+ file.getFilname() + "\"\r\n");  
//		            split.append("Content-Type: "+ file.getContentType()+"\r\n\r\n");  
//		            dos.write(split.toString().getBytes());  
//		            dos.write(file.getData(), 0, file.getData().length);  
//		            dos.write("\r\n".getBytes());  
//		        }  
		      
		      //把所有文件类型的实体数据发送出来
		        for(FormFile uploadFile : files){
		        	StringBuilder fileEntity = new StringBuilder();
		 	        fileEntity.append("--");
		 	        fileEntity.append(BOUNDARY);
		 	        fileEntity.append("\r\n");
		 	        fileEntity.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");
		 	        fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
		 	       dos.write(fileEntity.toString().getBytes());
		 	        if(uploadFile.getInStream()!=null){
		 	        	byte[] buffer = new byte[1024];
		 	        	int len = 0;
		 	        	int len2 = 0;
		 	        	while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){
		 	        		dos.write(buffer, 0, len);
		 	        		len2 = len2+len;
		 	        		System.out.println( "dataLength,len:"+uploadFile.getFile().length()+","+len2);
		 	        	}
		 	        	uploadFile.getInStream().close();
		 	        }else{
		 	        	dos.write(uploadFile.getData(), 0, uploadFile.getData().length);
		 	        }
		 	       dos.write("\r\n".getBytes());
		        }
		        
		        
		      byte[] end_data = endline.getBytes();//数据结束标志           
		      dos.write(end_data); 
		      dos.flush();

		      InputStream is = httpURLConnection.getInputStream();
		      InputStreamReader isr = new InputStreamReader(is, "utf-8");
		      BufferedReader br = new BufferedReader(isr);
		      String result = br.readLine();
		      System.out.println( "resunlt:"+result);
		      dos.close();
		      is.close();

		    } catch (Exception e)
		    {
		      e.printStackTrace();
		    }
	    }
    //----------test  vipshop public_api-------------------
    public static boolean post(String path, Map<String, String> params, FormFile[] files) throws Exception{     
        final String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线
        final String endline = "--" + BOUNDARY + "--\r\n";//数据结束标志
        
        int fileDataLength = 0;
        for(FormFile uploadFile : files){//得到文件类型数据的总长度
        	StringBuilder fileExplain = new StringBuilder();
 	        fileExplain.append("--");
 	        fileExplain.append(BOUNDARY);
 	        fileExplain.append("\r\n");
 	        fileExplain.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");
 	        fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
 	        fileExplain.append("\r\n");
 	        fileDataLength += fileExplain.length();
        	if(uploadFile.getInStream()!=null){
        		fileDataLength += uploadFile.getFile().length();
	 	    }else{
	 	    	fileDataLength += uploadFile.getData().length;
	 	    }
        }
        StringBuilder textEntity = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {//构造文本类型参数的实体数据
            textEntity.append("--");
            textEntity.append(BOUNDARY);
            textEntity.append("\r\n");
            textEntity.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");
            textEntity.append(entry.getValue());
            textEntity.append("\r\n");
        }
        //计算传输给服务器的实体数据总长度
        int dataLength = textEntity.toString().getBytes().length + fileDataLength +  endline.getBytes().length;
        
        URL url = new URL(path);
        int port = url.getPort()==-1 ? 80 : url.getPort();
       // Proxy proxy = new Proxy(java.net.Proxy.Type.HTTP, new InetSocketAddress(
           //    "10.0.0.172", 80));
//       // HttpURLConnection conn = (HttpURLConnection) url
//         //       .openConnection(proxy);
//        HttpURLConnection conn = (HttpURLConnection) url
//        .openConnection();
       Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);	
        //Socket   socket   =   new   Socket(proxy);   
        //Socket sc = (Socket)Connector.open("socket://10.0.0.172:80");
        
        OutputStream outStream = socket.getOutputStream();
        
        //下面完成HTTP请求头的发送
        String requestmethod = "POST "+ url.getPath()+" HTTP/1.1\r\n";
        outStream.write(requestmethod.getBytes());
        String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";
        outStream.write(accept.getBytes());
        String language = "Accept-Language: zh-CN\r\n";
        outStream.write(language.getBytes());
        String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "\r\n";
        outStream.write(contenttype.getBytes());
        String contentlength = "Content-Length: "+ dataLength + "\r\n";
        outStream.write(contentlength.getBytes());
        String alive = "Connection: Keep-Alive\r\n";
        outStream.write(alive.getBytes());
        String host = "Host: "+ url.getHost() +":"+ port +"\r\n";
        outStream.write(host.getBytes());
        //写完HTTP请求头后根据HTTP协议再写一个回车换行
        outStream.write("\r\n".getBytes());
        //把所有文本类型的实体数据发送出来
        outStream.write(textEntity.toString().getBytes());	       
        //把所有文件类型的实体数据发送出来
        for(FormFile uploadFile : files){
        	StringBuilder fileEntity = new StringBuilder();
 	        fileEntity.append("--");
 	        fileEntity.append(BOUNDARY);
 	        fileEntity.append("\r\n");
 	        fileEntity.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");
 	        fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");
 	        outStream.write(fileEntity.toString().getBytes());
 	        if(uploadFile.getInStream()!=null){
 	        	byte[] buffer = new byte[1024];
 	        	int len = 0;
 	        	int len2 = 0;
 	        	while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){
 	        		outStream.write(buffer, 0, len);
 	        		len2 = len2+len;
 	        		System.out.println( "dataLength,len:"+dataLength+","+len2);
 	        	}
 	        	uploadFile.getInStream().close();
 	        }else{
 	        	outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);
 	        }
 	        outStream.write("\r\n".getBytes());
        }
        //下面发送数据结束标志，表示数据已经结束
        outStream.write(endline.getBytes());
        
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String result = reader.readLine();
	      System.out.println( "resunlt:"+result);
        if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据，判断请求码是否为200，如果不是200，代表请求失败
        	System.out.println( "web service :"+reader.readLine().indexOf("200"));
        	return false;
        }
        outStream.flush();
        outStream.close();
        reader.close();
        socket.close();
        return true;
	}
    public static List<SellingBean> getGsonList(String rspString){
   	 Gson gson = new Gson();
   	List<SellingBean> list = null;
   	try {
   		list = gson.fromJson(rspString, new TypeToken<List<SellingBean>>() {}.getType());
   		
		} catch (Exception e) {
			return null;
		}
		return list;
   }
    public static List<User> getUserGsonList(String rspString){
      	 Gson gson = new Gson();
      	List<User> list = null;
      	try {
      		list = gson.fromJson(rspString, new TypeToken<List<User>>() {}.getType());
      		
   		} catch (Exception e) {
   			 e.printStackTrace();
   		}
   		return list;
      }
}  
